#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
告警推送系统 EXE 打包脚本
使用 PyInstaller 将 Python 应用打包成独立的可执行文件
"""

import os
import sys
import subprocess
from pathlib import Path

def build_exe():
    """构建 EXE 文件"""
    print("开始构建告警推送系统 EXE 文件...")
    
    # 当前目录
    current_dir = Path(__file__).parent
    
    # PyInstaller 命令参数
    cmd = [
        'pyinstaller',
        '--onefile',                    # 打包成单个文件
        '--windowed',                   # 隐藏控制台窗口，支持系统托盘
        '--name=SyslogPush',            # 可执行文件名称
        '--icon=icon.ico',              # 程序图标
        '--add-data=templates;templates',  # 包含模板文件夹
        '--add-data=config.example.json;.',  # 包含配置示例文件
        '--add-data=README.md;.',       # 包含说明文件
        '--add-data=icon.ico;.',        # 包含图标文件供程序使用
        '--hidden-import=flask',        # 确保 Flask 被包含
        '--hidden-import=requests',     # 确保 requests 被包含
        '--hidden-import=alibabacloud_dysmsapi20170525',  # 阿里云短信SDK
        '--hidden-import=apscheduler',  # 任务调度器
        '--hidden-import=pystray',      # 系统托盘库
        '--hidden-import=PIL',          # 图像处理库
        '--clean',                      # 清理临时文件
        '--noconfirm',                  # 不询问确认
        'app.py'                        # 主程序文件
    ]
    
    # 检查图标文件是否存在
    if not (current_dir / 'icon.ico').exists():
        print("警告: icon.ico 文件不存在，将使用默认图标")
        # 移除图标相关参数
        cmd = [arg for arg in cmd if not arg.startswith('--icon') and not arg.startswith('icon.ico')]
    else:
        print("使用图标文件: icon.ico")
    

    
    try:
        # 执行打包命令
        print(f"执行命令: {' '.join(cmd)}")
        result = subprocess.run(cmd, cwd=current_dir, check=True, 
                              capture_output=True, text=True, encoding='utf-8')
        
        print("\n=== 打包成功 ===")
        print(f"可执行文件位置: {current_dir / 'dist' / 'SyslogPush.exe'}")
        print("\n使用说明:")
        print("1. 将 dist 文件夹中的 'SyslogPush.exe' 复制到目标机器")
        print("2. 双击运行即可启动系统")
        print("3. 首次运行会在同目录下生成 config.json 配置文件")
        print("4. 根据需要修改配置文件中的参数")
        print("5. 重新启动程序使配置生效")
        
    except subprocess.CalledProcessError as e:
        print(f"\n=== 打包失败 ===")
        print(f"错误信息: {e}")
        print(f"标准输出: {e.stdout}")
        print(f"错误输出: {e.stderr}")
        return False
    
    return True

def create_startup_script():
    """创建启动脚本"""
    startup_script = '''
@echo off
chcp 65001 > nul
echo 启动告警推送系统...
echo.
echo 系统将在浏览器中打开管理界面
echo 如果浏览器未自动打开，请手动访问: http://localhost:5000
echo.
echo 按 Ctrl+C 停止系统
echo.
"SyslogPush.exe"
pause
'''
    
    with open('启动告警推送系统.bat', 'w', encoding='utf-8') as f:
        f.write(startup_script)
    
    print("已创建启动脚本: 启动告警推送系统.bat")

def create_readme():
    """创建部署说明文件"""
    readme_content = '''
# 告警推送系统 - 部署说明

## 系统要求
- Windows 7/8/10/11 (64位)
- 无需安装 Python 环境

## 安装步骤
1. 将整个文件夹复制到目标位置
2. 双击运行 "启动告警推送系统.bat" 或直接运行 "告警推送系统.exe"
3. 系统启动后会自动打开浏览器访问管理界面
4. 默认访问地址: http://localhost:5000

## 配置说明
1. 首次运行会生成 config.json 配置文件
2. 根据需要修改配置文件中的参数:
   - syslog_port: Syslog监听端口 (默认5140)
   - web_port: Web管理界面端口 (默认5000)
   - alert_keywords: 告警关键词列表
   - 通知渠道配置 (钉钉、企业微信、短信)
3. 修改配置后重启系统生效

## 功能特性
- 实时日志监控
- 智能告警推送
- Web管理界面
- 多渠道通知 (钉钉、企业微信、短信)
- 告警测试功能

## 注意事项
- 确保防火墙允许程序访问网络
- 如需修改端口，请确保端口未被占用
- 建议以管理员权限运行以避免权限问题

## 技术支持
如有问题请查看系统日志或联系技术支持。
'''
    
    with open('部署说明.txt', 'w', encoding='utf-8') as f:
        f.write(readme_content)
    
    print("已创建部署说明: 部署说明.txt")

if __name__ == '__main__':
    print("告警推送系统 EXE 打包工具")
    print("=" * 50)
    
    # 构建 EXE
    if build_exe():
        # 创建辅助文件
        os.chdir('dist')
        create_startup_script()
        create_readme()
        
        print("\n=== 打包完成 ===")
        print("所有文件已生成在 dist 文件夹中")
        print("可以将 dist 文件夹整体部署到目标机器")
    else:
        print("\n打包失败，请检查错误信息")
        sys.exit(1)